
#include <head.h>
#define N 50000

char name_text[100] = {0};
int log_stat = 0;

// 用户信息结构体 供  新建用户和修改信息使用
typedef struct user_info
{
    char buff_name[30];
    char buff_age[30];
    char buff_sex[30];
    char buff_passwd[30];
    char buff_salary[30];
    char buff_bumen[30];
    char buff_user_id[30];
} user_t;

// operae 1-登录  2-查询单次  3-退出 4-注册 5-查询历史
// user_name 用户名字
// 密码  (主要用作登录时候验证)
// log_fla 判断用户是否登录
// key_1 要查询的单词
// msg_masse 返回详细信息  登录报错 登录成功 查询单词返回的信息。。。  查询用户历史查询记录的信息。。。  这个是一个比较重要的属性
// user_name_reg 这个只有注册的使用用这个属性   防止用户在注册状态下在注册
// passwd_reg  同上
// reg_fla 返回注册是否成功信息（该值就是 注册函数返回值）  0  成功  -1 失败
typedef struct msg
{
    int operae;
    char user_name[100];
    char passwd[100];
    int log_fla;
    char key_1[100];
    char user_name_reg[100];
    char passwd_reg[100];
    int reg_fla;
    int is_admin;
    user_t user_info;
    char msg_masse[N];
} msg_t;

/**
 * @description: 
 * @param {user_t} user_info_msg
 * @return {*}
 */
int show_info_user_t(user_t user_info_msg)
{
    printf(
        "buff_name 【%s】 buff_age 【%s】  buff_sex【%s】  buff_passwd 【%s】 buff_salary【%s】 buff_bumen【%s】 buff_user_id 【%s】\n ",
        user_info_msg.buff_name,
        user_info_msg.buff_age,
        user_info_msg.buff_sex,
        user_info_msg.buff_passwd,
        user_info_msg.buff_salary,
        user_info_msg.buff_bumen,
        user_info_msg.buff_user_id);
}


// 根据名字展示所有信息
/**
 * @description: 
 * @param {int} sockfd
 * @param {char} *name
 * @return {*}
 */
int show_all_info_by_name(int sockfd,char *name)
{
    msg_t temp_msg;
    strcpy(temp_msg.user_name, name);
    temp_msg.operae = 803;
    size_t res = write(sockfd, &temp_msg, sizeof(msg_t));
    read(sockfd, &temp_msg, sizeof(temp_msg));
    printf("%s\n", temp_msg.msg_masse);
}


int main()
{
    // ================与业务无关========================

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    char admin_operat[20];
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8888);
    server_addr.sin_addr.s_addr = inet_addr("192.168.250.100");
    // socket连接 sockfd 就是传数据的  文件描述符
    int connect_fd = connect(
        sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    // 初始化用户的 消息结构体 测试用
    if (connect_fd == -1)
    {
        printf("i am 用户端 i 连接服务器失败了\n");
        return -1;
    }
    // ================与业务无关========================

    //
    // 4    普通用户注册
    // 901  管理员查询用户信息 查询所有用户
    // 902  管理员查询前10个用户
    // 903  管理员查询最后 10个用户
    // 904  管理员查询内容定制化查询
    // 905  管理员查询  所有历史记录
    // 906  管理员查询 最近50个历史记录
    // 907  管理员定制化查询历史记录
    // 908  管理员注册
    // 909  管理员修改内容  用户信息
    // 910  普通用户修改密码
    // 911  普通用户 修改个人信息  911
    // 912  管理员删除  使用工号
    // 913  管理员删除 使用名字

    int quest_i = 0;
    // 测试了一下只有这一个必选项  和  输入的一样
    user_t user_info_msg = {
        // .buff_age = '\n',    // 20
        // .buff_sex = '\n',    // 男
        // .buff_passwd = '\n', // 四位数字
        // .buff_salary = '\n', // 默认0  atoi 解
        // .buff_bumen = '\n', // 默认无部门 1 2 3 对应三个部门
        // .buff_name = "199", //   测试先修改这两个的内容
        // .buff_user_id = '\n', //

        .buff_age = "43",       // 回车默认 20
        .buff_sex = "2",        // 回车默认 男  1 男 2 女
        .buff_passwd = "2222",  // 四位数字
        .buff_salary = "13000", // 默认0  atoi 解
        .buff_bumen = "2",      // 默认无部门 1 2 3 对应三个部门
        .buff_name = "199",     // 测试先修改这两个的内容
        .buff_user_id = '\n',   // 管理员才用  普通用户使用
    };
    msg_t msg_get_server = {
        .passwd = "1111",
        .key_1 = "__",
        .log_fla = 0,
        .operae = 803,
        .user_name = "weq",
        .is_admin = 0,
        .msg_masse = "1-20\n",
        .user_info = user_info_msg};
    // 测试用内容
    if (0)
    {
        // 测试使用
        write(sockfd, &msg_get_server, sizeof(msg_t));
        return 0;
    }

    printf("连接服务器成功\n");
    for (int i = 0; i < 100; i++)
    {

        log_stat = msg_get_server.log_fla;
        strcpy(name_text, msg_get_server.user_name);
        // 用户菜单展示开始
        printf("****************************************\n");

        // 登录状态管理员展示
        if (msg_get_server.is_admin == 1 & log_stat == 1)
        {
            printf("***1-添加用户 2-删除用户  3-修改用户信息  4-查询用户  5-查询操作历史 6-退出 **\n");
            printf("**********当前是管理员用户 **************\n");
        }

        // 登录状态普通用户展示
        if (msg_get_server.is_admin == 0 & log_stat == 1)
        {
            printf("*** 1-查询信息 2-修改密码 3-修改信息 4-历史 5-退出 ******\n");
            printf("**********当前用户: %-5s **************\n", name_text);
        }

        // 未登录状态展示
        if (msg_get_server.is_admin == 0 & log_stat == 0)
        {
            printf("**********1-登录   2-注册***************\n");
            printf("****************************************\n");
        }

        quest_i = getchar();
        // 用户菜单展示结束
        // 根据输入quest_i 内容 进行操作

        // 未登录状态 进入这
        //  1 登录  operae = 1  801
        if (quest_i == 49 & log_stat == 0 & msg_get_server.is_admin == 0)
        {
            getchar();
            printf("登录--输入 名字和密码 使用回车隔开\n");
            char username[100] = {0}, passwd[100] = {0};

            fgets(username, 100, stdin);
            fgets(passwd, 100, stdin);
            username[strlen(username) - 1] = '\0';
            passwd[strlen(passwd) - 1] = '\0';
            printf("你输入的 %s,%s\n", username, passwd);

            // 发送信息  解出返回值
            msg_get_server.operae = 801;
            strcpy(msg_get_server.user_name, username);
            strcpy(msg_get_server.passwd, passwd);
            size_t res = write(sockfd, &msg_get_server, sizeof(msg_t));
            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            if (msg_get_server.log_fla == 1)
            {
                printf("登录成功...\n");
            }
            else
            {
                printf("登录失败 错误信息:[%s]...\n", msg_get_server.msg_masse);
            }
            // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
            //        msg_get_server.user_name, msg_get_server.operae,
            //        msg_get_server.log_fla, msg_get_server.key_1,
            //        msg_get_server.passwd, msg_get_server.msg_masse);
            continue;
        }

        // 2 注册 operae = 4 802
        if (quest_i == 50 & log_stat == 0 & msg_get_server.is_admin == 0)
        {
            char username[100] = {0}, passwd[100] = {0};
            getchar();
            msg_get_server.operae = 802;
            for (int j = 0; j < 100; j++)
            {
                user_info_msg.buff_salary[0] = '\n';
                user_info_msg.buff_bumen[0] = '\n';
                user_info_msg.buff_user_id[0] = '\n';

                printf("----输入用户名(必选项 无默认值)回车结束 无格式要求任意字符串\n");
                for (int i = 0; i < 100; i++)
                {
                    fgets(user_info_msg.buff_name, 30, stdin);

                    if (user_info_msg.buff_name[0] == 10)
                    {
                        printf("用户输入 [%d]-回车输入错误 重新输入名字\n", user_info_msg.buff_name[0]);
                    }
                    else
                    {
                        user_info_msg.buff_name[strlen(user_info_msg.buff_name) - 1] = '\0';
                        printf("用户输入 名字为【%s】 检查是否正确\n", user_info_msg.buff_name);
                        break;
                    }
                }

                printf("----输入年龄(非必选项 默认20 不输入请直接按回车)(格式要求数字10-100)回车结束\n");
                for (int i = 0; i < 100; i++)
                {
                    fgets(user_info_msg.buff_age, 30, stdin);
                    if (user_info_msg.buff_age[0] == 10)
                    {
                        printf("用户输入第一位字符ascii是 [%d]-回车 使用默认方式创建\n", user_info_msg.buff_age[0]);
                        break;
                    }
                    else
                    {
                        int a = atoi(user_info_msg.buff_age);
                        if (a == 0)
                        {
                            printf("输入错误请重新输入【输入数字】\n");
                        }
                        else
                        {
                            if (a > 100 | a < 0)
                            {
                                printf("年龄输入不正确  重新输入 1-100之内的数字 \n");
                            }
                            else
                            {
                                printf("用户输入 年龄为【%d】\n", a);
                                break;
                            }
                        }
                    }
                }

                printf("----输入性别(默认男 不输入请直接按回车)(格式要求 1或者2 1男 2 女)回车结束\n");

                for (int i = 0; i < 100; i++)
                {
                    fgets(user_info_msg.buff_sex, 30, stdin);
                    // printf("get 【%d 】【%c 】【%s 】",
                    // user_info_msg.buff_user_id[0],
                    // user_info_msg.buff_user_id[0],
                    // user_info_msg.buff_user_id);
                    // 回车就是10
                    if (user_info_msg.buff_sex[0] == 10)
                    {
                        printf("用户输入第一位字符ascii是 [%d]-回车 使用默认方式创建\n", user_info_msg.buff_user_id[0]);
                        break;
                    }
                    // 1
                    if (user_info_msg.buff_sex[0] == 49)
                    {
                        printf("输入1 选择男生\n");
                        break;
                    }
                    // 2
                    if (user_info_msg.buff_sex[0] == 50)
                    {
                        printf("输入2 选择女生\n");
                        break;
                    }
                    printf("输入性别不正确 输入 1 2 回车\n");
                }

                printf("----输入密码(默认1111 不输入请直接按回车)(格式要求 数字但只解析输入前四位)回车结束\n");
                for (int i = 0; i < 100; i++)
                {
                    fgets(user_info_msg.buff_passwd, 30, stdin);
                    // 密码输入第5为设置为  终止符 强制定位位数
                    user_info_msg.buff_passwd[4] = '\0';
                    if (user_info_msg.buff_passwd[0] == 10)
                    {
                        printf("用户输入 [%d]-回车 密码默认1111 \n", user_info_msg.buff_passwd[0]);
                        break;
                    }
                    else
                    {
                        int a = atoi(user_info_msg.buff_passwd);
                        if (a == 0 | a < 999)
                        {
                            printf("密码输入错误请重新输入4位数字\n");
                        }
                        else
                        {
                            printf("用户输入 密码为【%d】 \n", a);
                            break;
                        }
                    }
                }

                // printf(
                //     "员工姓名：%s 年龄：%s  性别：%s  密码：%s 工资：%s 部门：%s 员工工号：%s\n ",
                //     user_info_msg.buff_name,
                //     user_info_msg.buff_age,
                //     user_info_msg.buff_sex,
                //     user_info_msg.buff_passwd,
                //     user_info_msg.buff_salary,
                //     user_info_msg.buff_bumen,
                //     user_info_msg.buff_user_id);
                // 解出这些看着就感觉好麻烦啊  解这些东西给  服务器搞  放到一个结构体里面吗？？ 嗯行
                msg_get_server.user_info = user_info_msg;
                size_t res = write(sockfd, &msg_get_server, sizeof(msg_t));
                read(sockfd, &msg_get_server, sizeof(msg_get_server));
                // printf("%s", msg_get_server.msg_masse);
                // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                //        msg_get_server.user_name, msg_get_server.operae,
                //        msg_get_server.log_fla, msg_get_server.key_1,
                //        msg_get_server.passwd, msg_get_server.msg_masse);
                if (msg_get_server.reg_fla == 0)
                {
                    show_all_info_by_name(sockfd,user_info_msg.buff_name);
                    printf("注册成功了\n");
                    break;
                }
                else
                {
                    printf("注册失败了了\n");
                    break;
                }
            }
        }

        //  1 普通 查询个人信息  operae = 7 803
        if (quest_i == 49 & log_stat == 1 & msg_get_server.is_admin == 0)
        {
            getchar();
            // 发送信息  解出返回值
            msg_get_server.operae = 803;

            write(sockfd, &msg_get_server, sizeof(msg_t));
            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            printf("%s", msg_get_server.msg_masse);
            // printf("用户查询个人信息:\n员工姓名:%s\n  年龄：%d\n 性别:%s\n 部门：%s\n 工资:%d 工号:%d\n 密码:%d\n",
            //        msg_get_server.user_name,
            //        msg_get_server.user_info.buff_age,
            //        msg_get_server.user_info.buff_sex,
            //        msg_get_server.user_info.buff_bumen,
            //        msg_get_server.user_info.buff_salary,
            //        msg_get_server.user_info.buff_user_id,
            //        msg_get_server.user_info.buff_passwd);
            // msg_get_server.passwd
            continue;
        }

        // 2 todu 用户修改个人密码 910  本地有密码可以比对的 operae = 910  804
        if (quest_i == 50 & log_stat == 1 & msg_get_server.is_admin == 0)
        {
            // 这里还可以加一个判断  新弄的密码和之前的不同但是这个就先不弄了
            getchar();
            // 发送信息  解出返回值
            msg_get_server.operae = 804;
            // 进入到用户输入信息子菜单里面去
            int fla_break = 0;
            printf("----输入旧密码(格式要求 数字但只解析输入前四位)回车结束 输入 * 并回车取消\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_passwd, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_passwd[4] = '\0';
                if (user_info_msg.buff_passwd[0] == '*')
                {
                    fla_break = 1;
                    break;
                }
                if (user_info_msg.buff_passwd[0] == 10)
                {
                    printf("用户输入 回车 \n");
                    // break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_passwd);
                    if (a == 0 | a < 999)
                    {
                        printf("密码输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("用户输入 密码为【%d】 \n", a);
                        // 和当前密码进行比对
                        if (strcmp(user_info_msg.buff_passwd, msg_get_server.passwd) == 0)
                        {
                            printf("当前密码输入正确\n");
                            break;
                        }
                        printf("密码和旧密码不同 重新输入 \n");
                    }
                }
            }
            if (fla_break == 1)
            {
                continue;
            }
            printf("----输入新密码(格式要求 数字但只解析输入前四位)回车结束  输入 * 并回车取消\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_passwd, 30, stdin);
                if (user_info_msg.buff_passwd[0] == '*')
                {
                    fla_break = 1;
                    break;
                }
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_passwd[4] = '\0';
                if (user_info_msg.buff_passwd[0] == 10)
                {
                    printf("密码输入错误请重新输入4位数字\n");
                    // break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_passwd);
                    if (a == 0 | a < 999)
                    {
                        printf("密码输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("输入新密码 \n");
                        break;
                    }
                }
            }

            if (fla_break == 1)
            {
                continue;
            }

            printf("----再次输入新密码(格式要求 数字但只解析输入前四位)回车结束  输入 * 并回车取消\n");
            for (int i = 0; i < 100; i++)
            {
                char buff_tmp[30];
                // 保存刚才输入的密码  好进行比对
                strcpy(buff_tmp, user_info_msg.buff_passwd);
                fgets(user_info_msg.buff_passwd, 30, stdin);
                if (user_info_msg.buff_passwd[0] == '*')
                {
                    fla_break = 1;
                    break;
                }
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_passwd[4] = '\0';
                if (user_info_msg.buff_passwd[0] == 10)
                {
                    printf("密码输入错误请重新输入4位数字\n");
                    // break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_passwd);
                    if (a == 0 | a < 999)
                    {
                        printf("密码输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("用户输入新 密码为【%d】 \n", a);
                        // 和当前密码进行比对
                        if (strcmp(user_info_msg.buff_passwd, buff_tmp) == 0)
                        {
                            printf("新密码两次输入相同 \n");
                            break;
                        }
                        printf("新密码两次输入不容请 重新输入第一次  %s 第二次 %s  \n", buff_tmp, user_info_msg.buff_passwd);
                    }
                }
            }

            if (fla_break == 1)
            {
                continue;
            }

            msg_get_server.user_info = user_info_msg;
            // show_info_user_t();
            printf("发送消息给服务器\n");
            write(sockfd, &msg_get_server, sizeof(msg_t));
            printf("等待服务器回执\n");

            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            // printf("%s", msg_get_server.msg_masse);
            // 查看回执   msg_get_server.reg_fla 0 成功 1 失败
            printf("服务器返回消息 msg_mess[%s]",
                   msg_get_server.msg_masse);
        }

        // 3 修改个人信息 911  805
        if (quest_i == 51 & log_stat == 1 & msg_get_server.is_admin == 0)
        {
            getchar();
            // 发送信息  解出返回值
            msg_get_server.operae = 805;
            // 进入到用户输入信息子菜单里面去

            printf("----输入用户名(可能与其他用户名重复导致失败 不修改直接输入回车)回车结束 无格式要求任意字符串\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_name, 30, stdin);

                if (user_info_msg.buff_name[0] == 10)
                {
                    printf("用户输入 [%d]-回车不对用户名修改\n", user_info_msg.buff_name[0]);
                    strcpy(user_info_msg.buff_name, msg_get_server.user_name);
                    break;
                }
                else
                {
                    // 去掉输入的最后一个回车
                    printf("%zu ", strlen(user_info_msg.buff_name));
                    user_info_msg.buff_name[strlen(user_info_msg.buff_name) - 1] = '\0';
                    printf("%zu ", strlen(user_info_msg.buff_name));
                    printf("用户输入 名字为【%s】 检查是否正确\n", user_info_msg.buff_name);
                    break;
                }
            }

            printf("----输入年龄( 不修改请直接按回车)(格式要求数字10-100)回车结束\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_age, 30, stdin);
                if (user_info_msg.buff_age[0] == 10)
                {
                    printf("用户输入 [%d]-回车 不修改\n", user_info_msg.buff_age[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_age);
                    if (a == 0)
                    {
                        printf("输入错误请重新输入【输入数字】\n");
                    }
                    else
                    {
                        if (a > 100 | a < 0)
                        {
                            printf("年龄输入不正确  重新输入 1-100之内的数字 \n");
                        }
                        else
                        {
                            printf("用户输入 年龄为【%d】\n", a);
                            break;
                        }
                    }
                }
            }

            printf("----输入性别( 不修改请直接按回车)(格式要求 1或者2 1男 2 女)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_sex, 30, stdin);
                if (user_info_msg.buff_sex[0] == 10)
                {
                    printf("用户输入 [%d]-回车 不修改\n", user_info_msg.buff_user_id[0]);
                    break;
                }
                // 1
                if (user_info_msg.buff_sex[0] == 49)
                {
                    printf("输入1 选择男生\n");
                    break;
                }
                // 2
                if (user_info_msg.buff_sex[0] == 50)
                {
                    printf("输入2 选择女生\n");
                    break;
                }
                printf("输入性别不正确 输入 1 2 回车\n");
            }

            msg_get_server.user_info = user_info_msg;
            printf("发送消息给服务器 \n");
            write(sockfd, &msg_get_server, sizeof(msg_t));
            printf("等待服务器回执\n");

            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            // printf("%s", msg_get_server.msg_masse);
            // 查看回执   msg_get_server.reg_fla 0 成功 1 失败
            printf("服务器返回消息 msg_mess[%s]",
                   msg_get_server.msg_masse);
        }

        // 4 查询历史  operae = 5  806
        if (quest_i == 52 & log_stat == 1 & msg_get_server.is_admin == 0)
        {
            // 这个是很简单的 发消息收消息 可以作为模板
            getchar();
            // 发送信息  解出返回值
            msg_get_server.operae = 806;

            write(sockfd, &msg_get_server, sizeof(msg_t));
            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            printf("%s", msg_get_server.msg_masse);
            // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
            //        msg_get_server.user_name, msg_get_server.operae,
            //        msg_get_server.log_fla, msg_get_server.key_1,
            //        msg_get_server.passwd, msg_get_server.msg_masse);
        }

        // 5 退出 无操作码
        if (quest_i == 53 & log_stat == 1 & msg_get_server.is_admin == 0)
        {
            getchar();
            if (log_stat == 0)
            {
                printf("未登录，无需退出\n");
                continue;
            }
            msg_get_server.log_fla = 0;
            printf("退出成功\n");
        }

        // 3 管理员添加新用户  908
        if (quest_i == 49 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            msg_get_server.operae = 908;
            printf("管理员添加新用户 \n");
            // 吞掉垃圾字符
            getchar();
            printf("----输入工号(默认系统添加 建议默认 手动输入有重复风险导致创建失败 默认请直接按回车)(格式要求 数字)回车结束\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_user_id, 30, stdin);
                // printf("get 【%d 】【%c 】【%s 】",
                // user_info_msg.buff_user_id[0],
                // user_info_msg.buff_user_id[0],
                // user_info_msg.buff_user_id);
                // 回车就是10
                if (user_info_msg.buff_user_id[0] == 10)
                {
                    printf("用户输入第一位字符ascii是 [%d]-回车 使用默认方式创建\n", user_info_msg.buff_user_id[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_user_id);
                    if (a == 0)
                    {
                        printf("输入错误请重新输入\n");
                    }
                    else
                    {
                        printf("用户输入 工号为【%d】 检查是否正确\n", a);
                        break;
                    }
                }
            }

            printf("----输入用户名(必选项 无默认值)回车结束 无格式要求任意字符串\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_name, 30, stdin);

                if (user_info_msg.buff_name[0] == 10)
                {
                    printf("用户输入 [%d]-回车输入错误 重新输入名字\n", user_info_msg.buff_name[0]);
                }
                else
                {
                    user_info_msg.buff_name[strlen(user_info_msg.buff_name) - 1] = '\0';
                    printf("用户输入 名字为【%s】 检查是否正确\n", user_info_msg.buff_name);
                    break;
                }
            }

            printf("----输入年龄(非必选项 默认20 不输入请直接按回车)(格式要求数字10-100)回车结束\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_age, 30, stdin);
                if (user_info_msg.buff_age[0] == 10)
                {
                    printf("用户输入第一位字符ascii是 [%d]-回车 使用默认方式创建\n", user_info_msg.buff_age[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_age);
                    if (a == 0)
                    {
                        printf("输入错误请重新输入【输入数字】\n");
                    }
                    else
                    {
                        if (a > 100 | a < 0)
                        {
                            printf("年龄输入不正确  重新输入 1-100之内的数字 \n");
                        }
                        else
                        {
                            printf("用户输入 年龄为【%d】\n", a);
                            break;
                        }
                    }
                }
            }

            printf("----输入性别(默认男 不输入请直接按回车)(格式要求 1或者2 1男 2 女)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_sex, 30, stdin);
                // printf("get 【%d 】【%c 】【%s 】",
                // user_info_msg.buff_user_id[0],
                // user_info_msg.buff_user_id[0],
                // user_info_msg.buff_user_id);
                // 回车就是10
                if (user_info_msg.buff_sex[0] == 10)
                {
                    printf("用户输入第一位字符ascii是 [%d]-回车 使用默认方式创建\n", user_info_msg.buff_user_id[0]);
                    break;
                }
                // 1
                if (user_info_msg.buff_sex[0] == 49)
                {
                    printf("输入1 选择男生\n");
                    break;
                }
                // 2
                if (user_info_msg.buff_sex[0] == 50)
                {
                    printf("输入2 选择女生\n");
                    break;
                }
                printf("输入性别不正确 输入 1 2 回车\n");
            }

            printf("----输入密码(默认1111 不输入请直接按回车)(格式要求 数字但只解析输入前四位)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_passwd, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_passwd[4] = '\0';
                if (user_info_msg.buff_passwd[0] == 10)
                {
                    printf("用户输入 [%d]-回车 密码默认1111 \n", user_info_msg.buff_passwd[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_passwd);
                    if (a == 0 | a < 999)
                    {
                        printf("密码输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("用户输入 密码为【%d】 \n", a);
                        break;
                    }
                }
            }

            printf("----输入薪水(默认0 不输入请直接按回车)(格式要求 数字解析前10位)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_salary, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_salary[10] = '\0';
                if (user_info_msg.buff_salary[0] == 10)
                {
                    printf("管理员输入 [%d]-回车 薪水默认0 \n", user_info_msg.buff_salary[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_salary);
                    if (a == 0)
                    {
                        printf("薪水输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("管理员输入 薪水为【%d】 \n", a);
                        break;
                    }
                }
            }

            printf("----输入部门(默认'无部门' 不输入请直接按回车)(格式要求 枚举 1 2 3。 1(销售部) 2(技术部)3(后勤部)) 解析输入第一位 回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_bumen, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_bumen[1] = '\0';
                if (user_info_msg.buff_bumen[0] == 10)
                {
                    printf("管理员输入 [%d]-回车 部门无部门 \n", user_info_msg.buff_bumen[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_bumen);
                    if (a == 0 | a > 3)
                    {
                        printf("部门输入错误请重新输入 1,2,3\n");
                    }
                    else
                    {
                        printf("管理员输入 部门【%d】 \n", a);
                        break;
                    }
                }
            }

            // printf(
            //     "buff_name 【%s】 buff_age 【%s】  buff_sex【%s】  buff_passwd 【%s】 buff_salary【%s】 buff_bumen【%s】 buff_user_id 【%s】\n ",
            //     user_info_msg.buff_name,
            //     user_info_msg.buff_age,
            //     user_info_msg.buff_sex,
            //     user_info_msg.buff_passwd,
            //     user_info_msg.buff_salary,
            //     user_info_msg.buff_bumen,
            //     user_info_msg.buff_user_id);
            // 解出这些看着就感觉好麻烦啊  解这些东西给  服务器搞  放到一个结构体里面吗？？ 嗯行
            msg_get_server.user_info = user_info_msg;
            size_t res = write(sockfd, &msg_get_server, sizeof(msg_t));
            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            printf("%s", msg_get_server.msg_masse);
            // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
            //        msg_get_server.user_name, msg_get_server.operae,
            //        msg_get_server.log_fla, msg_get_server.key_1,
            //        msg_get_server.passwd, msg_get_server.msg_masse);
        }

        // 5 管理员删除用户  子菜单 1- 根据 名字 2 - 工号
        // 912  管理员删除  使用工号
        // 913  管理员删除 使用名字
        if (quest_i == 50 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            // 912  管理员删除  使用工号
            // 913  管理员删除  使用名字
            getchar();
            for (int __ = 0; __ < 100; __++)
            {
                char buff_tmp[5] = {0};
                printf("****删除用户信息 1-根据工号删除 2-根据 名字删除****\n****输入格式 1-111 (1-工号)   2-xiaoming (2-用户名)**** \n**** 回车结束退出到上一菜单****\n");
                fgets(admin_operat, 100, stdin);
                // 1 2 3  根据第一位选择 传递给oper的操作码 查询用户 1 - 全部 2- 最近20 3- 最后20 4- 定制化查询

                // 回车返回
                if (admin_operat[0] == 10)
                {
                    break;
                }
                // 1- 工号删除
                if (admin_operat[0] == 49)
                {
                    printf("选择使用工号删除用户 你要删除的是 [%s] \n", admin_operat + 2);
                    // continue;
                    printf("输入 0  并回车 确定 输入其他取消\n");
                    fgets(buff_tmp, 100, stdin);
                    if (buff_tmp[0] == 48)
                    {
                        printf("执行删除命令 向服务器发送消息\n");
                    }
                    else
                    {
                        printf("用户取消操作\n");
                        continue;
                    }
                    msg_get_server.operae = 912;
                    admin_operat[strlen(admin_operat) - 1] = '\0';
                    strcpy(msg_get_server.msg_masse, admin_operat + 2);
                    write(sockfd, &msg_get_server, sizeof(msg_t));
                    printf("客户端等待服务器消息回执 \n");

                    read(sockfd, &msg_get_server, sizeof(msg_get_server));
                    printf("%s", msg_get_server.msg_masse);
                    // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                    //        msg_get_server.user_name, msg_get_server.operae,
                    //        msg_get_server.log_fla, msg_get_server.key_1,
                    //        msg_get_server.passwd, msg_get_server.msg_masse);

                    continue;
                }
                // 2- 名字删除
                if (admin_operat[0] == 50)
                {
                    printf("选择使用用户名删除 你要删除的是 [%s] \n", admin_operat + 2);
                    // continue;
                    printf("输入 0  并回车 确定 输入其他取消\n");
                    fgets(buff_tmp, 100, stdin);
                    if (buff_tmp[0] == 48)
                    {
                        printf("执行删除命令 向服务器发送消息\n");
                    }
                    else
                    {
                        printf("用户取消操作\n");
                        continue;
                    }
                    msg_get_server.operae = 913;
                    admin_operat[strlen(admin_operat) - 1] = '\0';
                    strcpy(msg_get_server.msg_masse, admin_operat + 2);
                    write(sockfd, &msg_get_server, sizeof(msg_t));
                    printf("客户端等待服务器消息回执 \n");

                    read(sockfd, &msg_get_server, sizeof(msg_get_server));
                    printf("%s", msg_get_server.msg_masse);
                    // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                    //        msg_get_server.user_name, msg_get_server.operae,
                    //        msg_get_server.log_fla, msg_get_server.key_1,
                    //        msg_get_server.passwd, msg_get_server.msg_masse);

                    continue;
                }
            }
        }

        // 4 管理员修改用户信息 909
        if (quest_i == 51 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            printf("管理员修改用户信息 \n");
            msg_get_server.operae = 909;
            // 吞掉垃圾字符
            getchar();
            // 暂时设置工号不能修改这个是修改内容的第一个  东西

            printf("----输入工号(必须输入 根据指定工号修改用户信息)(格式要求 数字)回车结束\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_user_id, 30, stdin);
                // 回车就是10
                if (user_info_msg.buff_user_id[0] == 10)
                {
                    printf("用户[%d]-回车输入错误请输入要修改的工号 \n", user_info_msg.buff_user_id[0]);
                    // break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_user_id);
                    if (a == 0)
                    {
                        printf("输入错误请重新输入\n");
                    }
                    else
                    {
                        printf("用户输入 工号为【%d】 检查是否正确\n", a);
                        break;
                    }
                }
            }
            printf("----输入用户名(可能与其他用户名重复导致失败 不修改直接输入回车)回车结束 无格式要求任意字符串\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_name, 30, stdin);

                if (user_info_msg.buff_name[0] == 10)
                {
                    printf("用户输入 [%d]-回车不对用户名修改\n", user_info_msg.buff_name[0]);
                    break;
                }
                else
                {
                    user_info_msg.buff_name[strlen(user_info_msg.buff_name) - 1] = '\0';
                    printf("用户输入 名字为【%s】 检查是否正确\n", user_info_msg.buff_name);
                    break;
                }
            }

            printf("----输入年龄( 不修改请直接按回车)(格式要求数字10-100)回车结束\n");
            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_age, 30, stdin);
                if (user_info_msg.buff_age[0] == 10)
                {
                    printf("用户输入 [%d]-回车 不修改\n", user_info_msg.buff_age[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_age);
                    if (a == 0)
                    {
                        printf("输入错误请重新输入【输入数字】\n");
                    }
                    else
                    {
                        if (a > 100 | a < 0)
                        {
                            printf("年龄输入不正确  重新输入 1-100之内的数字 \n");
                        }
                        else
                        {
                            printf("用户输入 年龄为【%d】\n", a);
                            break;
                        }
                    }
                }
            }

            printf("----输入性别( 不修改请直接按回车)(格式要求 1或者2 1男 2 女)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_sex, 30, stdin);
                if (user_info_msg.buff_sex[0] == 10)
                {
                    printf("用户输入 [%d]-回车 不修改\n", user_info_msg.buff_user_id[0]);
                    break;
                }
                // 1
                if (user_info_msg.buff_sex[0] == 49)
                {
                    printf("输入1 选择男生\n");
                    break;
                }
                // 2
                if (user_info_msg.buff_sex[0] == 50)
                {
                    printf("输入2 选择女生\n");
                    break;
                }
                printf("输入性别不正确 输入 1 2 回车\n");
            }

            printf("----输入密码(1111 不修改请直接按回车)(格式要求 数字但只解析输入前四位)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_passwd, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_passwd[4] = '\0';
                if (user_info_msg.buff_passwd[0] == 10)
                {
                    printf("用户输入 [%d]-回车 密码默认1111 \n", user_info_msg.buff_passwd[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_passwd);
                    if (a == 0 | a < 999)
                    {
                        printf("密码输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("用户输入 密码为【%d】 \n", a);
                        break;
                    }
                }
            }

            printf("----输入薪水(不修改请直接按回车)(格式要求 数字解析前10位)回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_salary, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_salary[10] = '\0';
                if (user_info_msg.buff_salary[0] == 10)
                {
                    printf("管理员输入 [%d]-回车 薪水默认0 \n", user_info_msg.buff_salary[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_salary);
                    if (a == 0)
                    {
                        printf("薪水输入错误请重新输入4位数字\n");
                    }
                    else
                    {
                        printf("管理员输入 薪水为【%d】 \n", a);
                        break;
                    }
                }
            }

            printf("----输入部门(不修改请直接按回车)(格式要求 枚举 1 2 3。 1(销售部) 2(技术部)3(后勤部)) 解析输入第一位 回车结束\n");

            for (int i = 0; i < 100; i++)
            {
                fgets(user_info_msg.buff_bumen, 30, stdin);
                // 密码输入第5为设置为  终止符 强制定位位数
                user_info_msg.buff_bumen[1] = '\0';
                if (user_info_msg.buff_bumen[0] == 10)
                {
                    printf("管理员输入 [%d]-回车 部门无部门 \n", user_info_msg.buff_bumen[0]);
                    break;
                }
                else
                {
                    int a = atoi(user_info_msg.buff_bumen);
                    if (a == 0 | a > 3)
                    {
                        printf("部门输入错误请重新输入 1,2,3\n");
                    }
                    else
                    {
                        printf("管理员输入 部门【%d】 \n", a);
                        break;
                    }
                }
            }

            // printf(
            //     "buff_name 【%s】 buff_age 【%s】  buff_sex【%s】  buff_passwd 【%s】 buff_salary【%s】 buff_bumen【%s】 buff_user_id 【%s】\n ",
            //     user_info_msg.buff_name,
            //     user_info_msg.buff_age,
            //     user_info_msg.buff_sex,
            //     user_info_msg.buff_passwd,
            //     user_info_msg.buff_salary,
            //     user_info_msg.buff_bumen,
            //     user_info_msg.buff_user_id);
            // 解出这些看着就感觉好麻烦啊  解这些东西给  服务器搞  放到一个结构体里面吗？？ 嗯行
            msg_get_server.user_info = user_info_msg;
            size_t res = write(sockfd, &msg_get_server, sizeof(msg_t));

            read(sockfd, &msg_get_server, sizeof(msg_get_server));
            printf("%s", msg_get_server.msg_masse);
            // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
            //        msg_get_server.user_name, msg_get_server.operae,
            //        msg_get_server.log_fla, msg_get_server.key_1,
            //        msg_get_server.passwd, msg_get_server.msg_masse);
        }

        // 49 - 1 查询 用户子菜单
        // 901  管理员查询用户信息 查询所有用户
        // 902  管理员查询前10个用户
        // 903  管理员查询最后 10个用户
        // 904  管理员定制化查询
        if (quest_i == 52 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            getchar();
            for (int __ = 0; __ < 100; __++)
            {
                /* code */

                printf("查询用户信息 1-查询所有用户 2-前10个  3-后10个用户 4-按输入条件查询(1-100)回车结束退出到上一菜单\n");
                fgets(admin_operat, 100, stdin);
                // 1 2 3  根据第一位选择 传递给oper的操作码 查询用户 1 - 全部 2- 最近20 3- 最后20 4- 定制化查询
                if (admin_operat[0] == 10)
                {
                    break;
                }
                if (strlen(admin_operat) == 2)
                {
                    // printf("ascii 显示内容 【%d】\n", admin_operat[0]);

                    if (admin_operat[0] == 49)
                    {
                        msg_get_server.operae = 901;

                        write(sockfd, &msg_get_server, sizeof(msg_t));
                        read(sockfd, &msg_get_server, sizeof(msg_get_server));
                        printf("%s", msg_get_server.msg_masse);
                        // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                        //        msg_get_server.user_name, msg_get_server.operae,
                        //        msg_get_server.log_fla, msg_get_server.key_1,
                        //        msg_get_server.passwd, msg_get_server.msg_masse);
                    }

                    if (admin_operat[0] == 50)
                    {
                        // printf("管理员 执行  查询   2这个是2 的内容\n");
                        msg_get_server.operae = 902;

                        write(sockfd, &msg_get_server, sizeof(msg_t));
                        read(sockfd, &msg_get_server, sizeof(msg_get_server));
                        printf("%s", msg_get_server.msg_masse);
                        // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                        //        msg_get_server.user_name, msg_get_server.operae,
                        //        msg_get_server.log_fla, msg_get_server.key_1,
                        //        msg_get_server.passwd, msg_get_server.msg_masse);
                    }

                    if (admin_operat[0] == 51)
                    {
                        // printf("管理员 执行  查询   3这个是3 的内容\n");
                        msg_get_server.operae = 903;

                        write(sockfd, &msg_get_server, sizeof(msg_t));
                        read(sockfd, &msg_get_server, sizeof(msg_get_server));
                        printf("%s", msg_get_server.msg_masse);
                        // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                        //        msg_get_server.user_name, msg_get_server.operae,
                        //        msg_get_server.log_fla, msg_get_server.key_1,
                        //        msg_get_server.passwd, msg_get_server.msg_masse);
                    }
                }
                else
                {
                    // 4 定制化内容 查询
                    // printf("这个是 查询 4 定制化内容 将这部分发送给客户端【%s】\n", admin_operat);
                    msg_get_server.operae = 904;
                    admin_operat[9] == '\0';
                    // 将用户输入内容赋值到消息体里面
                    strcpy(msg_get_server.msg_masse, admin_operat);
                    write(sockfd, &msg_get_server, sizeof(msg_t));
                    read(sockfd, &msg_get_server, sizeof(msg_get_server));
                    printf("%s", msg_get_server.msg_masse);
                    // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                    //        msg_get_server.user_name, msg_get_server.operae,
                    //        msg_get_server.log_fla, msg_get_server.key_1,
                    //        msg_get_server.passwd, msg_get_server.msg_masse);
                }
            }
        }

        // 2    查询操作记录子菜单
        // 905  管理员查询  所有历史记录
        // 906  管理员查询 最近50个历史记录
        // 907  管理员定制化查询历史记录
        if (quest_i == 53 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            getchar();
            for (int __ = 0; __ < 100; __++)
            {
                printf("查询历史操作记录 1-查询所有记录 2-后（最近）50个  3-按输入条件查询(1-100)回车结束\n");
                fgets(admin_operat, 100, stdin);
                // 1 2 3  根据第一位选择 传递给oper的操作码  查询 操作记录 所有 最近50 定制化查询
                if (admin_operat[0] == 10)
                {
                    break;
                }
                if (strlen(admin_operat) == 2)
                {
                    // printf("ascii 显示内容 【%d】\n", admin_operat[0]);
                    if (admin_operat[0] == 49)
                    {
                        msg_get_server.operae = 905;

                        write(sockfd, &msg_get_server, sizeof(msg_t));
                        read(sockfd, &msg_get_server, sizeof(msg_get_server));
                        printf("%s", msg_get_server.msg_masse);
                        // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                        //        msg_get_server.user_name, msg_get_server.operae,
                        //        msg_get_server.log_fla, msg_get_server.key_1,
                        //        msg_get_server.passwd, msg_get_server.msg_masse);
                    }

                    if (admin_operat[0] == 50)
                    {
                        // printf("管理员 执行  查询   2这个是2 的内容\n");
                        msg_get_server.operae = 906;

                        write(sockfd, &msg_get_server, sizeof(msg_t));
                        read(sockfd, &msg_get_server, sizeof(msg_get_server));
                        printf("%s", msg_get_server.msg_masse);
                        // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                        //        msg_get_server.user_name, msg_get_server.operae,
                        //        msg_get_server.log_fla, msg_get_server.key_1,
                        //        msg_get_server.passwd, msg_get_server.msg_masse);
                    }
                }
                else
                {
                    // 4 定制化内容
                    // printf("这个是 查询 4 定制化内容 将这部分发送给客户端【%s】\n", admin_operat);
                    msg_get_server.operae = 907;
                    // 将用户输入内容赋值到消息体里面
                    admin_operat[9] = '\0';
                    strcpy(msg_get_server.msg_masse, admin_operat);
                    write(sockfd, &msg_get_server, sizeof(msg_t));
                    read(sockfd, &msg_get_server, sizeof(msg_get_server));
                    printf("%s", msg_get_server.msg_masse);
                    // printf("用户端收到数据::[%s] [%d][%d][%s][%s] msg_mess[%s]\n",
                    //        msg_get_server.user_name, msg_get_server.operae,
                    //        msg_get_server.log_fla, msg_get_server.key_1,
                    //        msg_get_server.passwd, msg_get_server.msg_masse);
                }
            }
        }

        // 6 管理员退出 无操作码
        if (quest_i == 54 & log_stat == 1 & msg_get_server.is_admin == 1)
        {
            getchar();
            printf("管理员退出\n");
            msg_get_server.is_admin = 0;
            msg_get_server.log_fla = 0;
            strcpy(msg_get_server.user_name, "0");
        }
    }
    close(connect_fd);
    close(sockfd);
}
